Javascript는 값이 초기화될 때 메모리를 할당한다. 더이상 해당 메모리를 사용하지 않는 경우 해제하는데, 다른 고급 언어처럼 Garbage Collector(GC)를 이용하여 메모리가 사용중인지 가늠하고 정리한다.
GC의 가장 기본적인 작동 방식은 참조를 하고 있는지를 확인하는 것이다.
그래서 가장 간단한 형태의 GC는 단순히 참조가 되는지를 일일히 확인한다. 이를 Reference-counting Garbage Collection이라고 한다.
이 방식의 문제점은 두개 이상의 오브젝트가 서로를 참조할 때 발생한다. 서로가 서로를 참조하는 순환 참조(Circular Reference)상황이 오면 GC는 두 오브젝트가 더이상 사용되지 않더라도 참조가 남아있기 때문에 메모리 할당이 아직 필요하다고 판단하여 메모리 누수가 발생한다.
참조가 있느냐를 판단하기 보다 도달이 가능한지를 판단하여 GC를 실행하는 방식이다. 참조를 시작하는 루트 오브젝트로부터 도달할 수 없는 경우 메모리에서 해제하기 때문에 순환 참조 문제가 발생하지 않는다.
이 방식의 단점은 강제로 메모리를 해제하고 싶을 때 그럴 수 없다는 점이다. 원하는 오브젝트를 버리고 싶을 때 위의 알고리즘에 부합하도록 명시적으로 도달 불가능하게 만들어야한다.